package amtf

import (
	"fmt"
	"regexp"
	"runtime"
	"strings"

	"server/global"
	"server/model/system"
)

func A字符串切片去重(strSlice []string) []string {
	// 创建一个 map 用于记录已经出现过的元素
	keys := make(map[string]bool)
	result := []string{}
	for _, entry := range strSlice {
		// 检查元素是否已经在 map 中
		if _, value := keys[entry]; !value {
			keys[entry] = true
			result = append(result, entry)
		}
	}
	return result
}

func A字段组去重(fields []*S字段) []*S字段 {
	// 用于记录已经出现过的 Name
	nameMap := make(map[string]bool)
	result := []*S字段{}

	for _, field := range fields {
		if field == nil {
			continue
		}
		// 检查 Name 是否已经出现过
		if _, exists := nameMap[field.Name]; !exists {
			nameMap[field.Name] = true
			result = append(result, field)
		}
	}
	return result
}

func A拆分字符(str string) (split []string) {
	split = strings.Split(str, ".")
	return
}

func Printf(format string, a ...interface{}) (n int, err error) {
	originalFormat := fmt.Sprintf(format, a...)
	_, file, line, _ := runtime.Caller(1)
	// 格式化输出内容
	// newFormat := fmt.Sprintf("[%s:%d] %s", file, line, format)
	return fmt.Printf(" %s [%s:%d]\n", originalFormat, file, line)
}

func A注册目录_单个(menu system.SysBaseMenu) system.SysBaseMenu {
	现有menu := system.SysBaseMenu{}
	err := global.GVA_DB.Where("Name = ?", menu.Name).First(&现有menu).Error
	if err != nil {
		fmt.Println(err)
		_ = global.GVA_DB.Create(&menu)
	} else {
		global.GVA_DB.Model(&menu).Where("id = ?", 现有menu.ID).Updates(menu)
	}
	return menu
}

func A注册目录_多个(menus []system.SysBaseMenu) []system.SysBaseMenu {
	for _, menu := range menus {
		// menu := &menus[i]
		A注册目录_单个(menu)
	}
	return menus
}

func A注册目录(menus ...system.SysBaseMenu) {
	// var count int64
	parentMenu := menus[0]
	otherMenus := menus[1:]

	已有记录 := &system.SysBaseMenu{}
	err := global.GVA_DB.Where("Name = ?", parentMenu.Name).First(&已有记录).Error
	if err != nil {
		fmt.Println(err)
	} else {
		parentMenu.ID = 已有记录.ID
	}

	// 将 parentMenu 单个save会报初始化值错误,只填了id，其他默认值没有填完整
	// global.GVA_DB.Save(&parentMenu)

	// 将 parentMenu 组装成切片save不报初始化值错误
	parentMenus := []system.SysBaseMenu{parentMenu}
	global.GVA_DB.Save(&parentMenus)

	for i := range otherMenus {
		v := &otherMenus[i]
		pid := parentMenu.ID
		v.ParentId = pid

		已有记录 := &system.SysBaseMenu{}
		err := global.GVA_DB.Where("Name = ?", v.Name).First(&已有记录).Error
		if err != nil {
			fmt.Println(err)
		} else {
			v.ID = 已有记录.ID
		}
	}
	err = global.GVA_DB.Save(&otherMenus).Error
	if err != nil {
		fmt.Println(err)
	}
}

func A注册api(apis ...system.SysApi) {
	// var count int64
	// var apiPaths []string
	// for i := range apis {
	// 	apiPaths = append(apiPaths, apis[i].Path)
	// }
	// global.GVA_DB.Find(&[]system.SysApi{}, "path in (?)", apiPaths).Count(&count)
	// if count > 0 {
	// 	return
	// }

	for i := range apis {
		v := &apis[i]
		已有记录 := &system.SysApi{}
		err := global.GVA_DB.Where("path = ? AND Method =?", v.Path, v.Method).First(&已有记录).Error
		if err != nil {
			fmt.Println(err)
		} else {
			v.ID = 已有记录.ID
		}
	}
	// err := global.GVA_DB.Create(&apis).Error
	err := global.GVA_DB.Save(&apis).Error
	if err != nil {
		fmt.Println(err)
	}
}

func A转小写(s string) string {
	// re := regexp.MustCompile(`(.)([A-Z][a-z]+)`)
	// s = re.ReplaceAllString(s, `${1}_${2}`)
	// re = regexp.MustCompile(`([a-z0-9])([A-Z])`)
	// return re.ReplaceAllString(s, `${1}_${2}`).Lower()
	re := regexp.MustCompile(`(.)([A-Z][a-z]+)`)
	s = re.ReplaceAllString(s, `${1}_${2}`)
	re = regexp.MustCompile(`([a-z0-9])([A-Z])`)
	return strings.ToLower(re.ReplaceAllString(s, `${1}_${2}`))
}
